package utils

import (
	"strings"

	"errors"

	"log"
	"net"

	"os"
	"path/filepath"
	"reflect"
	"time"
)

func Now() string {
	return time.Now().Format("2006-01-02 15:04:05")
}

func Date() string {
	return time.Now().Format("2006-01-02")
}

func PkgName(i interface{}) string {
	list := strings.Split(reflect.TypeOf(i).PkgPath(), "/")

	return list[len(list)-1]
}

func AppPath() string {
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		log.Fatal(err.Error())
	}
	return dir
}

func LocalIP() (string, error) {
	ifaces, err := net.Interfaces()
	if err != nil {
		return "", err
	}

	for _, iface := range ifaces {
		if iface.Flags&net.FlagUp == 0 {
			continue // interface down
		}
		if iface.Flags&net.FlagLoopback != 0 {
			continue // loopback interface
		}

		if strings.Contains(iface.Name, "VMnet") {
			continue
		}

		addrs, err := iface.Addrs()

		if err != nil {
			return "", err
		}
		for _, addr := range addrs {
			var ip net.IP
			switch v := addr.(type) {
			case *net.IPNet:
				ip = v.IP
			case *net.IPAddr:
				ip = v.IP
			}
			if ip == nil || ip.IsLoopback() {
				continue
			}
			ip = ip.To4()
			if ip == nil {
				continue // not an ipv4 address
			}

			return ip.String(), nil
		}
	}
	return "", errors.New("are you connected to the network?")
}

func Broadcast(laddr, raddr *net.UDPAddr, message string) error {
	conn, err := net.DialUDP("udp", laddr, raddr)

	if err != nil {
		return err
	}
	conn.Write([]byte(message))

	conn.Close()

	return nil
}
